/**
* @author Lourdes Sanchez
* @author Eugenia Jose
* @author Esteban Castro
* @author Carlos Fernandez
* @author Fernando Turon
* @version 1.0 01-05-12
*
* La clase GestorRonda se instancia en distintas parte de la aplicación
*
* @see Ronda
*/

package edu.uoc.tds.pec4.server.bbdd;

import edu.uoc.tds.pec4.i18n.GestorIdiomas;
import edu.uoc.tds.pec4.model.Prueba;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;

import edu.uoc.tds.pec4.common.RemotoInterface;
import edu.uoc.tds.pec4.model.Ronda;
import edu.uoc.tds.pec4.model.TipoPrueba;
import edu.uoc.tds.pec4.model.TipoRonda;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 *
 * @author Fernando
 */
public class GestorRonda {
    RemotoInterface remoto;

    public GestorRonda(RemotoInterface remoto){
        this.remoto = remoto;
    }

    /**
     * MÃ©todo para obtener una lista de instancias de Prueba
     * {pre: es un mÃ©todo tÃ­pico de retorno}
     * {post: una lista de instancias de Resultados}
     */
    public List<Ronda> getListaRondas(int id_prueba){
	//Establecemos la sentencia para obtener una lista de resultados
        List<Ronda> lista = new ArrayList<Ronda>();

	String sqlString = null;
	sqlString = "SELECT * FROM Ronda WHERE id_prueba = ? ORDER BY id_prueba;";

        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

	//Capturaremos la excepcion en caso de error
        try{            
            preparedStatement = this.remoto.getConexion().prepareStatement(sqlString);
            preparedStatement.setInt(1, id_prueba);
            
            resultSet = preparedStatement.executeQuery();
            
            //Si la consulta devuelve un dato generaremos la instancia correspondiente que devolvera el mÃ©todo
            while(resultSet.next()){
                Ronda ronda = new Ronda();
                
                ronda.setId_prueba(resultSet.getInt("id_prueba"));
		ronda.setId_tipo_ronda(resultSet.getInt("id_tipo_ronda"));


                lista.add(ronda);
            }
        }
        
        /** Capturamos el error en el acceso a la BBDD */
        catch (SQLException exc) {
            JOptionPane.showMessageDialog(null, exc.getMessage(), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("error.gestorbbdd.bbdd"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }

        /** Capturamos excepciÃ³n de carÃ¡cter general*/
        catch (Exception exc) {
            JOptionPane.showMessageDialog(null, exc.getMessage(), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("error.general"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }

        /** En todo caso ejecutamos el siguiente cÃ³digo*/
        finally {
            try {
		resultSet.close();
                preparedStatement.close();
            }

            /** Capturamos excepciÃ³n de carÃ¡cter general*/
            catch (Exception exc) {
                JOptionPane.showMessageDialog(null, exc.getMessage(), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
                //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("error.general"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
            }
        }

        return lista;
    }

    /**
     * MÃ©todo para obtener una lista de instancias de Prueba
     * {pre: es un mÃ©todo tÃ­pico de retorno}
     * {post: una lista de instancias de Resultados}
     */
    public Ronda getRonda(int id_prueba, int id_tipo_ronda){
        Ronda ronda = new Ronda();

        //Establecemos la sentencia para obtener una lista de resultados
	String sqlString = null;
	sqlString = "SELECT * FROM Ronda WHERE id_prueba = ? AND id_tipo_ronda = ? ORDER BY id_prueba, id_tipo_ronda;";

        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

	//Capturaremos la excepcion en caso de error
        try{
            preparedStatement = this.remoto.getConexion().prepareStatement(sqlString);
            preparedStatement.setInt(1, id_prueba);
            preparedStatement.setInt(1, id_tipo_ronda);

            resultSet = preparedStatement.executeQuery();

            //Si la consulta devuelve un dato generaremos la instancia correspondiente que devolvera el mÃ©todo
            if(resultSet.next()){
                ronda.setId_prueba(resultSet.getInt("id_prueba"));
		ronda.setId_tipo_ronda(resultSet.getInt("id_tipo_ronda"));
                ronda.setId_responsable_cierre(resultSet.getInt("id_responsable_cierre"));
            }

            //Si la lista esta vacia lanzaremos nuestra propia excepcion
            /*
            if(lista.isEmpty())
                throw new ListaVaciaException();
             *
             */
        }

        /** Capturamos el error en el caso en que la lista generada este vacÃ­a */
        /*
        catch(ListaVaciaException exc){
            JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("error.listaVacia.text"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }
        */
        /** Capturamos el error en el acceso a la BBDD */
        catch (SQLException exc) {
            JOptionPane.showMessageDialog(null, exc.getMessage(), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("error.gestorbbdd.bbdd"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }

        /** Capturamos excepciÃ³n de carÃ¡cter general*/
        catch (Exception exc) {
            JOptionPane.showMessageDialog(null, exc.getMessage(), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("error.general"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }

        /** En todo caso ejecutamos el siguiente cÃ³digo*/
        finally {
            try {
		resultSet.close();
                preparedStatement.close();
            }

            /** Capturamos excepción de carácter general*/
            catch (Exception exc) {
                JOptionPane.showMessageDialog(null, exc.getMessage(), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
                //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("error.general"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
            }
        }

        return ronda;
    }

    public boolean ValidarRonda(Prueba prueba, Ronda ronda){
        boolean esValido = true;

        try{
            //ComprobandoNoNulos
            if(ronda.getNumero_preguntas()==0){
                JOptionPane.showMessageDialog(null, "El campo Número de Preguntas no puede ser 0", GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
                throw new Exception();
            }

            if(ronda.getFecha_inicio_realizacion()==null){
                JOptionPane.showMessageDialog(null, "La Fecha de Inicio Realización no puede ser nula", GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
                throw new Exception();
            }

            else {
                try{
                    SimpleDateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy");
                    Date fecha = formatoFecha.parse(ronda.getFecha_fin_realizacion().toString());
                }
                catch (Exception exc){
                    JOptionPane.showMessageDialog(null, "La Fecha de Inicio REalziación no tiene le formato dd/mm/aaaa", GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
                    throw new Exception();
                }
            }

            if(ronda.getFecha_fin_realizacion()==null){
                JOptionPane.showMessageDialog(null, "El campo Fecha de Fin Realziacion no puede ser nulo", GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
                throw new Exception();
            }

            else{
                try{
                    SimpleDateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy");
                    Date fecha = formatoFecha.parse(prueba.getFecha_inicio_inscripcion().toString());
                }
                catch (Exception exc){
                    JOptionPane.showMessageDialog(null, "La Fecha de Fin Realización no tiene le formato dd/mm/aaaa", GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
                    throw new Exception();
                }
            }

            if(ronda.getFecha_fin_realizacion().compareTo(ronda.getFecha_inicio_realizacion())<0){
                JOptionPane.showMessageDialog(null, "La Fecha de Inicio Realizacion no puede ser anterior a la Fecha de Fin de Realizacion", GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
                throw new Exception();
            }

            if(ronda.getFecha_alta().compareTo(ronda.getFecha_inicio_realizacion())>0){
                JOptionPane.showMessageDialog(null, "La Fecha de Inicio Realizacion no puede ser anterior a la Fecha de Alta de Inscripción", GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
                throw new Exception();
            }

        }
        catch(Exception exc){
             esValido = false;
        }

        return esValido;
    }

    public void insertarRonda(Ronda ronda, TipoRonda tipoRonda){
        //Establecemos la sentencia para obtener una lista de resultados
	String sqlString = null;
	sqlString = "INSERT INTO Ronda "
                + "(id_prueba"
                + ",id_tipo_ronda"
                + ",fecha_alta)"
                + " VALUES(?,?,?,?);";

        PreparedStatement preparedStatement = null;

	//Capturaremos la excepcion en caso de error
        try{
            preparedStatement = this.remoto.getConexion().prepareStatement(sqlString);
            preparedStatement.setInt(1, ronda.getId_prueba());
            preparedStatement.setInt(2, ronda.getId_tipo_ronda());
            preparedStatement.setInt(4, ronda.getNumero_preguntas());
            preparedStatement.setDate(5, new java.sql.Date(ronda.getFecha_alta().getTime()));
            preparedStatement.executeUpdate();
        }

        /** Capturamos el error en el caso en que la lista generada este vacÃ­a */
        //catch(ListaVaciaException exc){
        //    JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("error.listaVacia.text"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        //}
        /** Capturamos el error en el acceso a la BBDD */
        catch (SQLException exc) {
            JOptionPane.showMessageDialog(null, exc.getMessage(), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("error.gestorbbdd.bbdd"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }
        /** Capturamos excepciÃ³n de carÃ¡cter general*/
        catch (Exception exc) {
            JOptionPane.showMessageDialog(null, exc.getMessage(), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("error.general"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }

        /** En todo caso ejecutamos el siguiente cÃ³digo*/
        finally {
            try {
                preparedStatement.close();
            }

            /** Capturamos excepciÃ³n de carÃ¡cter general*/
            catch (Exception exc) {
                JOptionPane.showMessageDialog(null, exc.getMessage(), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
                //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("error.general"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
            }
        }
    }


    public boolean existeRonda(Ronda ronda, TipoRonda tipoRonda){
        boolean existeRonda = false;

        //Establecemos la sentencia para obtener una lista de resultados
	String sqlString = null;
	sqlString = "SELECT * FROM Ronda WHERE "
                + "id_prueba = ? AND "
                + "id_tipo_ronda = ?";

        PreparedStatement preparedStatement = null;

	//Capturaremos la excepcion en caso de error
        try{
            preparedStatement = this.remoto.getConexion().prepareStatement(sqlString);
            preparedStatement.setInt(1, ronda.getId_prueba());
            preparedStatement.setInt(2, ronda.getId_tipo_ronda());
            preparedStatement.executeQuery();

            return true;
        }

        /** Capturamos el error en el caso en que la lista generada este vacÃ­a */
        //catch(ListaVaciaException exc){
        //    JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("error.listaVacia.text"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        //}
        /** Capturamos el error en el acceso a la BBDD */
        catch (SQLException exc) {
            JOptionPane.showMessageDialog(null, exc.getMessage(), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("error.gestorbbdd.bbdd"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }
        /** Capturamos excepciÃ³n de carÃ¡cter general*/
        catch (Exception exc) {
            JOptionPane.showMessageDialog(null, exc.getMessage(), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
            //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("error.general"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }

        /** En todo caso ejecutamos el siguiente cÃ³digo*/
        finally {
            try {
                preparedStatement.close();
            }

            /** Capturamos excepciÃ³n de carÃ¡cter general*/
            catch (Exception exc) {
                JOptionPane.showMessageDialog(null, exc.getMessage(), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
                //JOptionPane.showMessageDialog(null, GestorIdiomas.getMessage("error.general"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
            }
        }

        return existeRonda;
    }
}
